package br.com.usjt.sge.web.bean;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.CloseEvent;

import br.com.usjt.sge.complemento.Endereco;
import br.com.usjt.sge.complemento.EnderecoRN;
import br.com.usjt.sge.complemento.Telefone;
import br.com.usjt.sge.complemento.TelefoneRN;
import br.com.usjt.sge.correios.Cep;
import br.com.usjt.sge.correios.CepRN;
import br.com.usjt.sge.usuario.Usuario;
import br.com.usjt.sge.usuario.UsuarioRN;
import br.com.usjt.sge.util.CriptografiaUtil;
import br.com.usjt.sge.util.RNException;
import br.com.usjt.sge.veiculo.Veiculo;
import br.com.usjt.sge.veiculo.VeiculoRN;

/**
 * ManagedBean para cadastro de usuario.
 * @author cicero
 *
 */
@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean {
	
	private Usuario usuario = new Usuario();
	private Endereco endereco = new Endereco();
	private Telefone telefone = new Telefone();
	private Veiculo veiculo = new Veiculo();
	private String destinoSalvar;
	private String senhaCriptografada;
	private String confirmarSenha;
	private String cep;
	private String complemento;
	private String numero;

	public String novo() {
		
		this.destinoSalvar = "usuarioSucesso";
		this.usuario = new Usuario();
		this.usuario.setAtivo(true);
		
		return "usuario";
		
	}
	
	public String salvar() throws IOException {
		
		FacesContext context = FacesContext.getCurrentInstance();

		String senha = this.usuario.getSenha();
		
		if (senha!= null && senha.trim().length() > 0 && !senha.equals(this.confirmarSenha)) {
			
			FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
			context.addMessage(null, facesMessage);
			
			return null;
		}
		
		if (senha != null && senha.trim().length() == 0) {
			
			this.usuario.setSenha(this.senhaCriptografada);
			
		} else {
								
			try {
								
				String senhaCripto = CriptografiaUtil.criptografar(senha);
				this.usuario.setSenha(senhaCripto);
				
			} catch (NoSuchAlgorithmException e) {
				
				FacesMessage facesMessage = new FacesMessage(
						"Não foi possível criptografar a senha do usuário. Erro: " 
						+ e.getMessage());
				context.addMessage(null, facesMessage);
				return null;
			}
			
		}
		
		this.destinoSalvar = "usuarioSucesso";
				
		EnderecoRN enderecoRN = new EnderecoRN();
		UsuarioRN usuarioRN = new UsuarioRN();
		
		this.endereco.setCep(this.cep);
		this.endereco.setNumero(Integer.parseInt(numero));
		this.endereco.setComplemento(complemento);
		this.usuario.setEndereco(this.endereco);
		
		enderecoRN.salvar(this.endereco);
		
		TelefoneRN telefoneRN = new TelefoneRN();
		this.usuario.setTelefone(this.telefone);
		telefoneRN.salvar(this.telefone);
		
		usuarioRN.salvar(this.usuario);		
		
		VeiculoRN veiculoRN = new VeiculoRN();
		this.veiculo.setUsuario(this.usuario);
		veiculoRN.salvar(this.veiculo);		
		
		// Envia email apos o cadastro de um usuario novo
		if (this.destinoSalvar.equals("usuarioSucesso")) {
			
			try {
				
				usuarioRN.enviarEmailPosCadastramento(this.usuario);
				
			} catch (RNException e) {
				
				FacesMessage facesMessage = new FacesMessage(
						"Não foi possível enviar o e-mail de cadastro do usuário. Erro" + e.getMessage());
				context.addMessage(null, facesMessage);
				
				return null;
				
			}
			
		}
				
		return this.destinoSalvar;
		
	}
	
	public String editar() {
		
		this.senhaCriptografada = this.usuario.getSenha();
		this.destinoSalvar = "meuCadastro";
								
		this.numero = String.valueOf(endereco.getNumero());
		this.complemento = endereco.getComplemento();
		this.cep = endereco.getCep();
				
		return "usuarioAlterar";
				
	}

	public String alterar() {
		
		FacesContext context = FacesContext.getCurrentInstance();

		String senha = this.usuario.getSenha();
		
		if (senha!= null && senha.trim().length() > 0 && !senha.equals(this.confirmarSenha)) {
			
			FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
			context.addMessage(null, facesMessage);
			
			return null;
		}
		
		if (senha != null && senha.trim().length() == 0) {
			
			this.usuario.setSenha(this.senhaCriptografada);
			
		} else {
								
			try {
								
				String senhaCripto = CriptografiaUtil.criptografar(senha);
				this.usuario.setSenha(senhaCripto);
				
			} catch (NoSuchAlgorithmException e) {
				
				FacesMessage facesMessage = new FacesMessage(
						"Não foi possível criptografar a senha do usuário. Erro: " 
						+ e.getMessage());
				context.addMessage(null, facesMessage);
				return null;
			}
			
		}
		
		this.destinoSalvar = "meuCadastro";
				
		EnderecoRN enderecoRN = new EnderecoRN();
		UsuarioRN usuarioRN = new UsuarioRN();
		
		this.endereco.setCep(this.cep);
		this.endereco.setNumero(Integer.parseInt(numero));
		this.endereco.setComplemento(complemento);
		this.usuario.setEndereco(this.endereco);
		
		enderecoRN.alterar(this.endereco);
		
		TelefoneRN telefoneRN = new TelefoneRN();
		this.usuario.setTelefone(this.telefone);
		telefoneRN.alterar(this.telefone);
		
		usuarioRN.atualizar(this.usuario);		
		
		VeiculoRN veiculoRN = new VeiculoRN();
		this.veiculo.setUsuario(this.usuario);
		veiculoRN.atualizar(this.veiculo);	
		
		return "meuCadastro";
								
		
	}
	
	public String consultaCep() {

		this.endereco = new Endereco();
		this.endereco = consultaEnderecoCep();

		if (!(endereco != null)) {

			FacesContext context = FacesContext.getCurrentInstance();
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"Nenhum endereço encontrado para este CEP.",
					"Informe um CEP válido para o consulta.");
			context.addMessage(null, facesMessage);
			return null;
		}
		return "usuario";
	}

	public Endereco consultaEnderecoCep() {

		Cep cepConsultado = new Cep();
		CepRN cepRN = new CepRN();
		Endereco end = new Endereco();
		cepConsultado = cepRN.consultaCep(this.cep);

		end.setCep(cepConsultado.getCep());
		end.setLogradouro(cepConsultado.getTipo_logradouro() + " "
				+ cepConsultado.getLogradouro());
		end.setBairro(cepConsultado.getBairro());
		end.setCidade(cepConsultado.getCidade());
		end.setUf("SP");

		return end;
	}
	
	public void excluir() {
		
		VeiculoRN veiculoRN = new VeiculoRN();
		Veiculo v;
		v = veiculoRN.buscarPorUsuario(this.usuario.getCodigo());
		veiculoRN.excluir(v);
		
		TelefoneRN telefoneRN = new TelefoneRN();
		telefoneRN.excluir(this.usuario.getTelefone());
		
		EnderecoRN enderecoRN = new EnderecoRN();
		enderecoRN.excluir(this.usuario.getEndereco());
		
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.excluir(this.usuario);
					
		
	}
	
	public void handleClose(CloseEvent event) {  
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Panel Closed", "Closed panel id:'" + event.getComponent().getId() + "'");  
          
        addMessage(message);  
    }
	
	private void addMessage(FacesMessage message) {  
        FacesContext.getCurrentInstance().addMessage(null, message);  
    }  
					
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public String getConfirmarSenha() {
		return confirmarSenha;
	}
	public void setConfirmarSenha(String confirmarSenha) {
		this.confirmarSenha = confirmarSenha;
	}
	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Telefone getTelefone() {
		return telefone;
	}

	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}
			
	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public String getDestinoSalvar() {
		return destinoSalvar;
	}

	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}
	
	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getComplemento() {
		return complemento;
	}

	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}


	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getSenhaCriptografada() {
		return senhaCriptografada;
	}

	public void setSenhaCriptografada(String senhaCriptografada) {
		this.senhaCriptografada = senhaCriptografada;
	}
		
}
